package com.ygp.dtp.core.handler;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.ygp.dtp.common.enums.ConfigFileTypeEnum;
import com.ygp.dtp.core.parser.ConfigParser;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.ServiceLoader;

/**
 * @description: 配置处理器，请看parser包
 * @motto: 代码源于生活，高于生活艺术
 * @author: zhouhengzhe
 * @date: 2022/8/9 14:57
 * @since 1.0
 **/
public class ConfigHandler {
    private static final List<ConfigParser> CONFIG_PARSERS = Lists.newCopyOnWriteArrayList();

    public ConfigHandler() {
        //使用spi注册解析配置文件，，看META-INF/services/com.ygp.dtp.core.parser.ConfigParser
        ServiceLoader<ConfigParser> configParsers = ServiceLoader.load(ConfigParser.class);
        configParsers.forEach(CONFIG_PARSERS::add);
    }

    /**
     * 解析配置
     */
    public Map<Object, Object> parse(String content, ConfigFileTypeEnum type) throws IOException {
        Map<Object, Object> map = Maps.newHashMap();
        for (ConfigParser configParser : CONFIG_PARSERS) {
            if (configParser.supports(type)) {
                map = configParser.doParse(content);
            }
        }
        return map;
    }

    /**
     * 创建单例对象
     */
    public static ConfigHandler getInstance() {
        return ConfigHandlerHolder.INSTANCE;
    }

    /**
     * 本次使用的是静态内部类创建单例（推荐使用）,也可以使用枚举，双重检查，饿汉式（静态代码块），饿汉式（静态常量）
     */
    private static class ConfigHandlerHolder {
        private static final ConfigHandler INSTANCE = new ConfigHandler();
    }
}
